<?php

namespace IYUU\sdk\CoolQ\Event;

use IYUU\sdk\CoolQ\Context;
use IYUU\sdk\CoolQ\CoolQCode;
use IYUU\sdk\CoolQ\Domain\User as DomainUser;
use IYUU\sdk\CoolQ\Event;

/**
 * 上报类型：post_type -> notice
 * Class Notice
 * @package IYUU\sdk\CoolQ\Event
 */
class Notice extends Event
{
    /**
     * 通知类型
     * - 可能的值：群文件上传{group_upload}、群管理员变动{group_admin}、群成员减少{group_decrease}、群成员增加{group_increase}、
     * -          群禁言{group_ban}、好友添加{friend_add}、群消息撤回{group_recall}、好友消息撤回{friend_recall}、
     * -          好友戳一戳或群内戳一戳{poke}、群红包运气王{lucky_king}、群成员荣誉变更提示{honor}、群成员名片更新{group_card}、
     * -          接收到离线文件{offline_file}、其他客户端在线状态变更{client_status}、精华消息{essence}
     * @var string
     */
    protected $notice_type = '';

    /**
     * 消息子类型（可能的值：{friend}、{group}、{group_self}、{other}）
     * - 正常消息是 normal, 匿名消息是 anonymous, 系统提示(如「管理员已禁止群内匿名聊天」)是 notice
     * @var string
     */
    protected $sub_type = '';

    /**
     * 文件信息
     * @var array
     */
    protected $file = [];

    /**
     * 操作者QQ
     * @var int
     */
    protected $operator_id = 0;

    /**
     * 父类的抽象方法，子类必须实现
     * @param Context $context
     * @return mixed
     */
    public function index(Context $context): array
    {
        // 调试日志
        if ($this->getConfig('debug')) {
            file_put_contents(runtime_path() . '/Notice.log', __METHOD__ . p($this->notice_type, false), FILE_APPEND);
        }
        /**
         * 默认通知处理器
         */
        return $this->callableAction($this->notice_type);
    }

    /**
     * 回调：群成员增加{group_increase}
     * See: https://docs.go-cqhttp.org/event/#群成员增加
     */
    public function callable_group_increase(): array
    {
        if (!empty($this->sub_type) && is_string($this->sub_type)) {
            // 系统功能：监听 群成员增加{group_increase}事件
            DomainUser::listenGroupIncrease($this->user_id, $this->group_id, $this->self_id);
            /**
             * 事件子类型
             * - 可能的值：管理员已同意入群{approve}、管理员邀请入群{invite}
             */
            if ($this->isBot()) {
                $msg = '谢谢群主和各位管理员。' . CoolQCode::Face(78);
            } else {
                $msg = $this->getConfig('reply.group_increase', '欢迎新朋友加入，请先阅读群公告！');
            }
            $this->sendBack($msg);
        }

        return [];
    }

    /**
     * 回调：群成员减少{group_decrease}
     * @return array
     */
    public function callable_group_decrease(): array
    {
        if (!empty($this->sub_type) && is_string($this->sub_type)) {
            // 系统功能：监听 群成员减少{group_decrease}事件
            DomainUser::listenGroupDecrease($this->user_id, $this->group_id, $this->self_id);
            /**
             * 事件子类型
             * - 可能的值：主动退群{leave}、成员被踢{kick}、登录号被踢{kick_me}
             */
            $replace = [
                '{user_id}' => $this->user_id,
                '{group_id}' => $this->group_id,
                '{operator_id}' => $this->operator_id
            ];
            switch ($this->sub_type) {
                case 'leave':
                case 'kick':
                    //$msg = strtr($this->getConfig('reply.group_decrease.kick', '{user_id} 各奔东西，江湖有缘再见。'), $replace);
                    //$this->sendBack($msg, false, false);
                    break;
                case 'kick_me':
                    //$msg = strtr($this->getConfig('reply.group_decrease.kick_me', '{user_id} 被踢出群：{group_id}，操作者：{operator_id}。'), $replace);
                    //$this->sendMaster($msg);
                    break;
                default:
                    break;
            }
        }

        return [];
    }

    /**
     * 回调：群消息撤回{group_recall}
     * @return array
     */
    public function callable_group_recall(): array
    {
        return [];
    }

    /**
     * 回调：群文件上传{group_upload}
     * @return array
     */
    public function callable_group_upload(): array
    {
        //$msg = 'QQ:'. $this->user_id. ' 上传了群文件！';
        //$this->sendBack($msg);

        return [];
    }
}
